package com.xuecheng.comment.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xuecheng.api.comment.model.dto.CommentDTO;
import com.xuecheng.api.comment.model.qo.CommentModel;
import com.xuecheng.api.comment.model.vo.CommentVO;
import com.xuecheng.comment.agent.ContentApiAgent;
import com.xuecheng.comment.common.constant.CommentErrorCode;
import com.xuecheng.comment.convert.CommentConvert;
import com.xuecheng.comment.entity.Comment;
import com.xuecheng.comment.mapper.CommentMapper;
import com.xuecheng.comment.mapper.CommentReplyMapper;
import com.xuecheng.comment.service.CommentService;
import com.xuecheng.common.domain.page.PageRequestParams;
import com.xuecheng.common.domain.page.PageVO;
import com.xuecheng.common.exception.ExceptionCast;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author itcast
 */
@Slf4j
@Service
public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment> implements CommentService {




    @Autowired
    private ContentApiAgent contentApiAgent;

    @Autowired
    private CommentReplyMapper commentReplyMapper;

    @Autowired
    private CommentMapper commentMapper;


    @Override
    //开启事务
    @Transactional
    public CommentDTO createComment(CommentDTO dto, String username) {

        //  2.核实关键信息
        //       2.1根据课程id（targetId）获取课程信息
        //new LambdaQueryWrapper<>();
        //       	2.1.1判断课程信息是否存在
        //       			不存在：抛出异常
        //       	2.1.2判断课程状态
        //       		只能是已经发布且在使用
        //dto转po，保存数据
        //3.创建评论对象并设置属性值
        //po转dto，返回

        //        4.插入数据库，判断是否插入成功
        return null;
    }

    @Override
    @Transactional ( readOnly = true )
    public PageVO<CommentDTO> queryCommentList(PageRequestParams params, CommentModel commentModel) {
        // 		1.3获取课程id
        // 				如果课程id为空则抛出异常

        //2.核实关键信息
        // 	 2.1根据课程id（targetId）获取课程信息
        // 				2.1.1判断课程信息是否存在
        // 						不存在：抛出异常
        // 				2.1.2判断课程状态
        // 						只能是已经发布且在使用

        //3.设置查询条件
        return null;
    }


    /**
     * 查询评论信息的数量统计
     *
     * @param targetId
     * @return
     */
    @Override
    public CommentVO queryNums(Long targetId) {
        //判断评论对象是否为空
        //查询总评论数
        //查询平均数
        //查询每个星级的数量
        //数据封装
        return null;
    }

    private void getParamsTerm(PageRequestParams params, CommentModel commentModel) {
        //1.判断关键数据
        // 		1.1分页信息，评论查询信息是否存在
        // 				不存在：抛出异常
        // 		1.2获取分页信息
        // 				如果分页信息中当前页码（pageNo)为空或者不合法（<1)则设置为1
        // 				如果分页信息中每页显示条数(pageSize)为空则设置为10
    }

    private LambdaQueryWrapper<Comment> queryListTerm(CommentModel commentModel) {
        //判断课程id是否为空，不为空-添加查询条件
        //判断课程名称是否为空，不为空-添加模糊查询
        return null;
    }

    @Override
    public PageVO<CommentDTO> queryCourseCommentList(PageRequestParams params, CommentModel commentModel) {
        //查询关键参数
        if (params.getPageNo() == null || params.getPageNo() < 1) {
            params.setPageNo(PageRequestParams.DEFAULT_PAGE_NUM);
        }
        if (params.getPageSize() == null || params.getPageSize() < 0) {
            params.setPageSize(PageRequestParams.DEFAULT_PAGE_SIZE);
        }
        PageVO<CommentDTO> pageVO = new PageVO<>();
        Page<Comment> page = new Page<>(params.getPageNo(), params.getPageSize());
        QueryWrapper<Comment> qw = new QueryWrapper<>();
        if (commentModel.getLevel() != null) {
            if (commentModel.getLevel() == 1) {
                qw.eq("star_rank", 5).or().eq("star_rank", 4);
            }
            if (commentModel.getLevel() == 0) {
                qw.eq("star_rank", 3);
            }
            if (commentModel.getLevel() == -1) {
                qw.eq("star_rank", 2).or().eq("star_rank", 1);
            }
        }
        commentMapper.selectPage(page, qw);
        pageVO.setPage(Integer.parseInt(params.getPageNo().toString()));
        pageVO.setPageSize(Integer.parseInt(params.getPageSize().toString()));
        List<Comment> comments = page.getRecords();
        List<CommentDTO> commentDTOS = new ArrayList<>();
        for (Comment comment : comments) {
            CommentDTO commentDTO = CommentConvert.INSTANCE.po2dto(comment);
            commentDTOS.add(commentDTO);
        }
        pageVO.setItems(commentDTOS);
        pageVO.setCounts(page.getTotal());
        //查询条件
        //判断评星等级，不为空-》
        //      l=1  好评
        //      l=0  中评
        //      l=-1 差评
        //判断是否可以评论
        //          Y->可以
        //          N->不可以
        //判断来至哪里
        //判断状态
        //创建分页对象
        return pageVO;
    }

    @Override
    public PageVO<CommentDTO> queryMCourseCommentList(PageRequestParams params) {
        //查询关键参数
        // 		1.2获取分页信息
        // 				如果分页信息中当前页码（pageNo)为空或者不合法（<1)则设置为1
        if (params.getPageNo() == null || params.getPageNo() < 1) {
            params.setPageNo(PageRequestParams.DEFAULT_PAGE_NUM);
        }
        // 				如果分页信息中每页显示条数(pageSize)为空则设置为10
        if (params.getPageSize() == null || params.getPageSize() < 0) {
            params.setPageSize(PageRequestParams.DEFAULT_PAGE_SIZE);
        }
        //查询条件
        PageVO<CommentDTO> pageVO = new PageVO<>();
        Page<Comment> page = new Page<>(params.getPageNo(), params.getPageSize());
        QueryWrapper<Comment> qw = new QueryWrapper<>();
        commentMapper.selectPage(page, qw);
        pageVO.setPage(Integer.parseInt(params.getPageNo().toString()));
        pageVO.setPageSize(Integer.parseInt(params.getPageSize().toString()));
        List<Comment> comments = page.getRecords();
        List<CommentDTO> commentDTOS = new ArrayList<>();
        for (Comment comment : comments) {
            CommentDTO commentDTO = CommentConvert.INSTANCE.po2dto(comment);
            commentDTOS.add(commentDTO);
        }
        pageVO.setItems(commentDTOS);
        pageVO.setCounts(page.getTotal());
        //判断状态
        //创建分页对象
        //封装查询信息并返回
        return pageVO;
    }

    /**
     * 删除评论信息
     * @param commentId
     */
    @Transactional
    public void deleteComment(Long commentId) {
        //判断关键数据
        //根据ID获取评论信息
        Comment comment = commentMapper.selectById(commentId);
        //判断评论信息是否存在
        if (comment == null) {
            ExceptionCast.cast(CommentErrorCode.E_180009);
        }
        //判断评论信息是否删除
        if (comment.getStatus() == 0) {
            ExceptionCast.cast(CommentErrorCode.E_180010);
        }
        //逻辑删除评论信息
        comment.setStatus(0);
        try {
            commentMapper.updateById(comment);
        } catch (Exception e) {
            ExceptionCast.cast(CommentErrorCode.E_180011);
        }
        //判断删除是否成功
    }

    /**
     *批量删除评论信息
     * @param request commentId拼接字符串
     */
    @Transactional
    public void deleteComments(String request) {
        //切割请求字符串获得评论ID数组
        log.info("参数为：{}", request);
        String[] ids = request.split(",");
        //判断评论ID数组是否为空
        if (ids == null || ids.length == 0) {
            ExceptionCast.cast(CommentErrorCode.E_180014);
        }
        //遍历数组获得每一个评论ID
        for (String id : ids) {
            deleteComment(Long.parseLong(id));
        }
            //判断评论信息是否存在
            //判断评论信息是否删除
            //判断是否删除成功
    }

}
